package com.ljc.db.backend.dm;

import com.ljc.db.backend.dm.dataItem.DataItem;
import com.ljc.db.backend.dm.logger.Logger;
import com.ljc.db.backend.dm.page.PageOne;
import com.ljc.db.backend.dm.pageCache.PageCache;
import com.ljc.db.backend.tm.TransactionManager;


public interface DataManager {
    DataItem read(long uid) throws Exception;

    long insert(long xid, byte[] data) throws Exception;

    void close();

    /**
     * 从空文件创建DM【需要对第一页进行初始化，例如设置随机字节用于校验】
     */
    public static DataManager create(String path, long mem, TransactionManager tm) {
        PageCache pc = PageCache.create(path, mem);
        Logger lg = Logger.create(path);

        DataManagerImpl dm = new DataManagerImpl(pc, lg, tm);
        dm.initPageOne();
        return dm;
    }

    /**
     * 从已有文件创建DM【需要对随机字节进行校验，判断是否需要执行恢复流程】
     */
    public static DataManager open(String path, long mem, TransactionManager tm) {
        PageCache pc = PageCache.open(path, mem);
        Logger lg = Logger.open(path);
        DataManagerImpl dm = new DataManagerImpl(pc, lg, tm);
        // 校验第一页的校验字节
        if(!dm.loadCheckPageOne()) {
            // 校验失败，进行恢复
            Recover.recover(tm, lg, pc);
        }
        dm.fillPageIndex();
        // 设置启动位置的校验字节
        PageOne.setVcOpen(dm.pageOne);
        // 将第一页刷到磁盘上
        dm.pc.flushPage(dm.pageOne);

        return dm;
    }
}
